package com.mystudy.concurrent.designModel.futureModel;

/**
 * TODO: 任务是的具体实现，以及任务结束之后的处理
 * 缺点是get方法获取值的时候，如果done方法一直没有处理完成，就会一直阻塞。
 * @author acy
 * @since 2019/05/29 17:10
 */
public class MyAsynFutrue<T> implements MyFuture<T>{
	//任务是否执行结束
	private volatile boolean done=false;
	//执行的结果
	private T result;

	/**
	 * 完成方法。完成的时候会进行唤醒等待的get方法
	 * @param result
	 */
	public void done(T result){
		synchronized (this){
			this.result=result;
			this.done=true;
			this.notifyAll();
		}
	}

	/**
	 * 获取结果，如果任务已经完成就获取值
	 * @return
	 * @throws InterruptedException
	 */
	@Override
	public T get() throws InterruptedException {
		synchronized (this){
			while (!done){
				this.wait();
			}
		}
		return result;
	}
}
